www.gusucode.com > VC++ 树形节点属性框控件-源码程序 > VC++ 树形节点属性框控件-源码程序/code/MainFrm.cpp
//Download by http://www.NewXing.com // MainFrm.cpp : implementation of the CMainFrame class // #include "stdafx.h" #include "Demo2_CPropertyGrid_Lib.h" #include "MainFrm.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMainFrame IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_MESSAGE(WM_USER_TREE_SELCHANGED, OnTreeSelchanged) ON_MESSAGE(PGWM_PROPERTYGRID_NOTIFY, OnPropertyGridNotify) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMainFrame construction/destruction CMainFrame::CMainFrame() { // TODO: add member initialization code here } CMainFrame::~CMainFrame() { } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; // 创建分隔视图 m_wndSplitter1.CreateStatic(this, 1, 2); m_wndSplitter2.CreateStatic(&m_wndSplitter1, 2, 1, WS_CHILD | WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0,0)); m_wndTree.Create(WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS, CRect(0,0,1,1), &m_wndSplitter2, m_wndSplitter2.IdFromRowCol(0,0)); m_wndProperty.Create(CRect(0,0,1,1), &m_wndSplitter2, m_wndSplitter2.IdFromRowCol(1,0)); m_wndInfo.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOHSCROLL, CRect(0,0,1,1), &m_wndSplitter1, m_wndSplitter1.IdFromRowCol(0,1)); m_wndProperty.SetOwner(this); // 使属性窗口的通知消息发给主窗口 m_wndSplitter1.SetColumnInfo(0, 175, 1); m_wndSplitter2.SetRowInfo(0, 175, 1); // 设置树窗口的图标 static CImageList iml; iml.Create(16, 16, ILC_COLOR | ILC_MASK, 5, 1); iml.Add( ::LoadIcon(NULL, IDI_APPLICATION) ); iml.Add( ::LoadIcon(NULL, IDI_ERROR) ); iml.Add( ::LoadIcon(NULL, IDI_QUESTION ) ); iml.Add( ::LoadIcon(NULL, IDI_WARNING) ); iml.Add( ::LoadIcon(NULL, IDI_INFORMATION) ); m_wndTree.SetImageList(&iml, TVSIL_NORMAL); // 创建树窗口的结点 HTREEITEM hRoot = m_wndTree.InsertItem( _T("根结点"), 0, 0 ); HTREEITEM hChild1 = m_wndTree.InsertItem( _T("子结点1"), 1, 1, hRoot ); HTREEITEM hChild2 = m_wndTree.InsertItem( _T("子结点2"), 2, 2, hRoot ); m_wndTree.Expand(hRoot, TVE_EXPAND); // 设置状态信息窗口 static CFont font; font.CreatePointFont(105, _T("宋体")); m_wndInfo.SetFont(&font); m_wndInfo.SetMargins(3,3); m_wndInfo.ReplaceSel( _T("选中树窗口中的结点后, 可以在属性窗口修改其属性.") ); return 0; } BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.cx = 600; cs.cy = 400; return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CFrameWnd::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const { CFrameWnd::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMainFrame message handlers LRESULT CMainFrame::OnTreeSelchanged(WPARAM wParam, LPARAM lParam) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)lParam; HTREEITEM hSelected = pNMTreeView->itemNew.hItem; // 根据选中的结点生成属性项 m_wndProperty.ResetContent(); CPropertyGridItem* pCategory = m_wndProperty.AddCategory( _T("树结点属性") ); CPropertyGridItem* pItemName = new CPropertyGridItem( _T("结点名称"), m_wndTree.GetItemText(hSelected) ); pItemName->SetDescription( _T("设置结点的名称") ); pItemName->SetItemData( (DWORD)hSelected ); pCategory->AddChildItem(pItemName); CPropertyGridItemList* pItemIcon = new CPropertyGridItemList( _T("结点图标") ); pItemIcon->SetDescription( _T("设置结点的图标") ); pItemIcon->SetItemData( (DWORD)hSelected ); pItemIcon->GetConstraints()->AddConstraint( _T("0 - Application") ); pItemIcon->GetConstraints()->AddConstraint( _T("1 - Error") ); pItemIcon->GetConstraints()->AddConstraint( _T("2 - Question") ); pItemIcon->GetConstraints()->AddConstraint( _T("3 - Warning") ); pItemIcon->GetConstraints()->AddConstraint( _T("4 - Information") ); int nImage; m_wndTree.GetItemImage(hSelected, nImage, nImage); pItemIcon->SetListIndex(nImage); pCategory->AddChildItem(pItemIcon); pCategory->Expand(); return 0; } LRESULT CMainFrame::OnPropertyGridNotify(WPARAM wParam, LPARAM lParam) { int nAction = HIWORD(wParam); // 属性表的通知事件 int nID = LOWORD(wParam); // 属性表的控件ID CPropertyGridItem* pItem = (CPropertyGridItem*)lParam; // 引发事件的属性项 // 只处理属性值改变的消息 if (nAction == PGN_ITEMVALUE_CHANGED) { // 获取属性项对应的树结点 HTREEITEM hTreeItem = (HTREEITEM)pItem->GetItemData(); if (pItem->GetCaption() == _T("结点名称")) { // 设置结点的名称 m_wndTree.SetItemText(hTreeItem, pItem->GetValue()); } else if (pItem->GetCaption() == _T("结点图标")) { // 设置结点的图标 int nImage = ((CPropertyGridItemList*)pItem)->GetListIndex(); m_wndTree.SetItemImage(hTreeItem, nImage, nImage); } } return 0; }